# 忽略了对数据类型，元素溢出等问题的判断。
import json

import utils.util


class HashTable:
    def __init__(self, size):
        self.elem = [None for i in range(size)]  # 使用list数据结构作为哈希表元素保存方法
        self.count = size  # 最大表长

    def hash(self, key):
        return key % self.count  # 散列函数采用除留余数法

    def insert_hash(self, list_a_dict):
        """插入关键字到哈希表内"""
        # 去除传入的dict中的type_count数字，利用type_count对其进行排序
        # type_count与type一一对应且全局唯一
        key = list_a_dict['type_count']
        address = self.hash(key)  # 求散列地址
        while self.elem[address]:  # 当前位置已经有数据了，发生冲突。
            address = (address + 1) % self.count  # 线性探测下一地址是否可用
        self.elem[address] = list_a_dict  # 没有冲突则直接保存。

    # list_a_dict是待匹配的dict
    def search_hash(self, list_a_dict):
        FLAG_NAME = False
        FLAG_TYPE = False
        """查找关键字，返回布尔值"""
        # 利用type_count对其进行排序,type_count与type一一对应且全局唯一
        key = list_a_dict['type_count']
        # key = list_a_dict['type']
        print("key:", key, end=" ")
        star = address = self.hash(key)
        # print("self.elem[address]['type_count']", self.elem[address]['type_count'])
        # 如果当前address位置的数据的type_count不等于key，那就线性探测下一个位置
        while self.elem[address]['type_count'] != key:
            FLAG_TYPE = False
            # address递增到下一个位置
            address = (address + 1) % self.count
            if not self.elem[address]['type_count'] or address == star:  # 说明没找到或者循环到了开始的位置
                # print(self.elem[address])
                return 2.0
        # 如果当前address位置的数据的type_count等于key，执行以下内容
        # 遍历address位置数据的keyword数组，将其与待查找的数据的name匹配，e为原来库中的数据
        current_type_score = self.elem[address]['type_score']  # 记录一下当前的type
        # print("current_type", current_type_score)
        FLAG_TYPE = True
        for e in self.elem[address]['keyword']:
            # 如果待查找的list_a_dict的keyword列表中的唯一name，与当前e中的name匹配，应该直接返回True
            if utils.util.is_matched(e['name'], list_a_dict['keyword'][0]['name']) and \
                    self.elem[address]['type'].split("_")[0] == list_a_dict['type'].split("_")[0]:
                # FLAG_TYPE = True
                print("匹配成功", end=" ")
                FLAG_NAME = True
                return e['level']
        # 如果没有找到匹配的name（incident），但是有对应的type，应该赋值其对应的type_score
        if not FLAG_NAME:
            if FLAG_TYPE:
                # if list_a_dict['type']
                # list_a_dict['type_score']
                print("找到对应的type", end=" ")
                return current_type_score
            elif FLAG_TYPE is False:
                return 2.0
        else:
            return 2.0


if __name__ == '__main__':
    # list_a = [12, 67, 56, 16, 25, 37, 22, 29, 15, 47, 48, 34]
    info = open('../Test/hash_test.json', 'r+', encoding="utf-8")
    info = json.load(info)
    # print(info, len(info))
    # list_a = [i for i in info]
    list_a = []
    for i in info:
        list_a.append(i)
    # print(list_a)
    hash_table = HashTable(len(list_a))
    for i in list_a:
        hash_table.insert_hash(i)
    # for i in hash_table.elem:
    #     if i:
    #         print((i, hash_table.elem.index(i)), end=" ")
    # print("\n")
    ############
    test = {
        "type": "市场监管_消费维权_售后服务",
        "keyword": [
            {
                "name": "来电人反映芜湖奇瑞汽车公司瑞虎8车质量的问题",
                # "level": 3.0
            }
        ],
        # "type_score": 3,
        "type_count": 20000
    }
    #########
    print(hash_table.search_hash(test))
    # print(hash_table.search_hash(33))
    # print(hash_table.search_hash(100))
